Solutions for INSERT OR UPDATE on SQL Server
https://stackoverflow.com/questions/108403/solutions-for-insert-or-update-on-sql-server

1)

DECLARE @key INT  = 12
DECLARE @msg NVARCHAR(MAX) = 'L2'

BEGIN TRAN
   IF EXISTS (
       SELECT *
       FROM DBO.LOG2ENTITY WITH (UPDLOCK, SERIALIZABLE)
       WHERE ID = @key
        )
   BEGIN
      UPDATE DBO.LOG2ENTITY
      SET
        Message = @msg
      WHERE ID =@key
   END
   ELSE
   BEGIN
      INSERT INTO DBO.LOG2ENTITY (Message)
      VALUES (@msg)
   END
COMMIT TRAN

2) Идея-костыль:
2.1) Если строка отсутствует в таблице (EXSIST SELECT)
     (Опционально возможен сразу UPDLOCK),
       то пробуем выполнить вставку строки, в случае возникновения ошибки, что ключ уже существует, игнорируем ее.
       (При этом возможно, что вместо большей части данных пока что подставляем значения по умолчанию, важен только ключ)
2.2) Явно начинаем транзакцию
2.2.1) Извлекаем строку с блокировкой (WITH UPDLOCK). К данному этапу строка уже гарантированно есть в БД (Если не рассматривать удаление).
2.2.2) При необходимости проверяем состояние строки. Обеспечивая идемпотентность и корректность с точки зрения многопоточности и версионности.
2.2.3) При необходимости обновляем строку.

Теги: SqlQuery